Python
파이썬기초_05_데코레이터와 클로저
작성자 : Heehyeon Yoo|2025-12-26
# Python# Decorator# Closure
1. 클로저 (Closure)
데코레이터를 이해하기 위한 필수 선수 지식.
- 정의:
- 자신을 감싼 외부 스코프(Outer Scope)의 변수를 기억하고 있는 내부 함수.
- 외부 함수가 실행이 끝나고 소멸(Return)되어도, 내부 함수가 그 변수를 계속 붙들고 있는 현상.
- 조건:
- 함수 안에 함수(중첩 함수)가 있어야 함.
- 내부 함수가 외부 함수의 변수를 참조해야 함.
- 외부 함수가 내부 함수를 반환(Return)해야 함.
- 비유:
- 타임캡슐. 공장(외부 함수)은 문을 닫았는데, 그 안에서 만든 제품(내부 함수)이 공장의 재료(외부 변수)를 여전히 품고 있음.
2. 데코레이터 (Decorator)
기존 함수를 수정하지 않고 앞뒤에 부가 기능을 추가(장식)하고 싶을 때 사용.
- 개념:
- 클로저(Closure)를 활용한 문법적 설탕(Syntactic Sugar).
@기호를 사용하여 함수 위에 얹음.
- 원리:
target_func = decorator(target_func)와 완전히 동일함.- 함수를 파라미터로 받아서, 기능이 추가된 새로운 함수(Wrapper)를 반환하는 것.
3. 기본 구조
def my_decorator(func):
def wrapper():
print("1. 함수 실행 전")
func() # 원본 함수 실행
print("2. 함수 실행 후")
return wrapper
@my_decorator
def hello():
print("Hello World")
# 실행
hello()
# 출력:
# 1. 함수 실행 전
# Hello World
# 2. 함수 실행 후
4. 실전 활용 예시
개발할 때 실제로 자주 쓰는 패턴들.
A. 실행 시간 측정 (Timer)
- 상황: 내 코드가 얼마나 빠른지/느린지 성능 테스트할 때.
- 구현: 원본 함수 실행 전 시간 기록
start→ 실행 → 후 시간 기록end→end - start출력.
B. 로그인/권한 체크 (Authentication)
- 상황: 특정 페이지나 API는 로그인한 사람만 써야 함.
- 구현:
- 데코레이터 내부(
wrapper)에서if user.is_logged_in:확인. - 로그인 안 했으면 함수 실행 안 하고 에러 반환.
- 로그인 했으면
func()실행.
- 데코레이터 내부(
- 장점: 핵심 비즈니스 로직(글쓰기, 조회 등)에 지저분한
if문을 다 뺄 수 있음. (관심사의 분리)
5. functools.wraps
- 문제점: 데코레이터를 쓰면 원본 함수의 이름(
__name__)과 설명(__doc__)이wrapper함수 것으로 덮어씌워짐. - 해결:
@functools.wraps(func)를wrapper위에 붙여주면 원본 함수의 메타데이터를 유지해줌. (국룰)